﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DeviceCommon
{
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //  设备实现类应当注意以下要点:
    // (1) 设备每一个执行动作完成后(无论结果成功或失败)，应主动通过服务器向请求方(客户端)回复信息，
    //      如果没有回复，执行动作对调用方是无效的
    // (2) 回复消息由服务器执行，但回复消息主体由设备方创建生成
    // (3) 回复消息的格式是固定的(由通讯协议规定)，否则接收方解析会发生异常
    // (4) 在执行某一个动作完成后，如果设备状态发生变化，应主动通知宿主程序(设备管理器)
    // (5) 设备管理器应该绑定设备状态变化和设备动作更新状态的事件
    // (6) 通知设备管理器状态变化和向客户端回复信息是同时执行，优先通知设备管理器，随后回复客户端
    // (7) 对于请求方:
    //      执行不需要读取用户输入信息的动作应使用DoAction命令;
    //      需要读取用户输入信息的动作必须使用Start命令;
    //      执行耗时较长的动作应使用Start命令;
    // (8) 请求方应在业务结束时主动关闭Socket连接;
    // (9) 存在轮询(循环执行相同操作)或者尝试多次读取的情况Stop命令才有效，其它情况Stop命令无效
    // (10) 特别注意设备执行相关动作后应及时更新设备的运行状态，即设置属性State的值
    // (11) 执行耗时较长的动作，应实现超时检测方法，超时后中止动作并回复超时信息，防止客户端无限等待
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
    /// <summary>
    /// 设备操作接口类，接口的实现是为了响应服务器(Socket通讯)接收到的请求  
    /// </summary>
    public interface IDevice
    {
        /// <summary>
        /// 设备ID
        /// </summary>
        int ID { get; set; }

        /// <summary>
        /// 设备名称
        /// </summary>
        string Name { get; }

        /// <summary>
        /// 指示设备的运行状态
        /// </summary>
        DeviceState State { get; }

        /// <summary>
        /// 设备是否已经完成初始化
        /// </summary>
        bool Inited { get; }

        /// <summary>
        /// 设备是否已经退出(关闭)
        /// </summary>
        bool Exited { get; }

        /// <summary>
        /// 设备当前执行Socket通信会话的ID
        /// </summary>
        string SessionID { get; set; }

        /// <summary>
        /// 设备执行动作超时时间
        /// </summary>
        int TimeoutMillisecond { get; set; }

        /// <summary>
        /// 交互窗口句柄，用于和交互窗口通信
        /// </summary>
        IntPtr WindowHandle { get; set; }

        /// <summary>
        /// 最新的错误信息
        /// </summary>
        string ErrorMessage { get; }

        bool Test(string param, out string outParam);

        void Init(string inParam, out string outParam);

        bool DoAction(string param, out string outParam);

        void Start(string inParam, out string outParam);
   
        void Stop(string inParam, out string outParam);

        void SetWorkingDoneAction(WorkingCompletedHandler handler0, WorkingFailedHandler handler1);
 
        void Exit(string inParam, out string outParam);

        void SendMessage(string msgPack);

        void ShowConfigDialog(string inParam);
    }
}
